package org.agent.aigccore.core.service.user;

import jakarta.annotation.Resource;
import org.agent.aigccore.dao.mappers.mysql.UserInfoMapper;
import org.agent.aigccore.model.po.UserInfoPO;
import org.agent.aigccore.utils.PasswordUtil;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户服务类
 */
@Service
public class UserService {
    
    @Resource
    private UserInfoMapper userInfoMapper;
    
    /**
     * 根据用户ID查询用户信息
     *
     * @param userId 用户ID
     * @return 用户信息
     */
    public UserInfoPO load(String userId) {
        return userInfoMapper.load(userId);
    }
    
    /**
     * 根据用户名查询用户信息
     *
     * @param username 用户名
     * @return 用户信息
     */
    public UserInfoPO loadByUsername(String username) {
        return userInfoMapper.loadByUsername(username);
    }
    
    /**
     * 根据邮箱查询用户信息
     *
     * @param email 邮箱
     * @return 用户信息
     */
    public UserInfoPO loadByEmail(String email) {
        return userInfoMapper.loadByEmail(email);
    }
    
    /**
     * 新增用户信息
     *
     * @param userInfoPO 用户信息
     * @return 影响行数
     */
    public int insert(UserInfoPO userInfoPO) {
        // 对密码进行加密
        String encodedPassword = PasswordUtil.encode(userInfoPO.getPassword());
        userInfoPO.setPassword(encodedPassword);
        
        // 设置创建时间和更新时间
        Date now = new Date();
        userInfoPO.setGmtCreate(now);
        userInfoPO.setGmtModified(now);
        
        return userInfoMapper.insert(userInfoPO);
    }
    
    /**
     * 更新用户信息
     *
     * @param userInfoPO 用户信息
     * @return 影响行数
     */
    public int update(UserInfoPO userInfoPO) {
        // 设置更新时间
        userInfoPO.setGmtModified(new Date());
        
        return userInfoMapper.update(userInfoPO);
    }
    
    /**
     * 更新最后登录时间
     *
     * @param userId 用户ID
     * @return 影响行数
     */
    public int updateLastLoginTime(String userId) {
        return userInfoMapper.updateLastLoginTime(userId, new Date());
    }
    
    /**
     * 根据用户ID删除用户信息
     *
     * @param userId 用户ID
     * @return 影响行数
     */
    public int delete(String userId) {
        return userInfoMapper.delete(userId);
    }
    
    /**
     * 查询所有管理员用户
     *
     * @return 管理员用户列表
     */
    public List<UserInfoPO> loadAdminUsers() {
        return userInfoMapper.loadAdminUsers();
    }
    
    /**
     * 重置用户密码
     *
     * @param userId 用户ID
     * @param newPassword 新密码
     * @return 影响行数
     */
    public int resetPassword(String userId, String newPassword) {
        // 对新密码进行加密
        String encodedPassword = PasswordUtil.encode(newPassword);
        return userInfoMapper.resetPassword(userId, encodedPassword);
    }
    
    /**
     * 根据用户名重置用户密码
     *
     * @param username 用户名
     * @param newPassword 新密码
     * @return 影响行数
     */
    public int resetPasswordByUsername(String username, String newPassword) {
        // 对新密码进行加密
        String encodedPassword = PasswordUtil.encode(newPassword);
        UserInfoPO userInfoPO = loadByUsername(username);
        if (userInfoPO != null) {
            return userInfoMapper.resetPassword(userInfoPO.getUserId(), encodedPassword);
        }
        return 0;
    }
    
    /**
     * 分页搜索用户
     */
    public List<UserInfoPO> searchUsers(String keyword, String role, String status, int page, int size) {
        Map<String, Object> params = new HashMap<>();
        params.put("keyword", keyword);
        params.put("role", role);
        params.put("status", status);
        params.put("limit", size);
        params.put("offset", (page - 1) * size);
        return userInfoMapper.searchUsers(params);
    }

    public long countSearchUsers(String keyword, String role, String status) {
        Map<String, Object> params = new HashMap<>();
        params.put("keyword", keyword);
        params.put("role", role);
        params.put("status", status);
        return userInfoMapper.countSearchUsers(params);
    }

    /**
     * 验证用户密码
     *
     * @param rawPassword 原始密码
     * @param encodedPassword 加密后的密码
     * @return 验证结果
     */
    public boolean verifyPassword(String rawPassword, String encodedPassword) {
        return PasswordUtil.matches(rawPassword, encodedPassword);
    }
}